﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.HtmlControls;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace jQuery.WebControls.UI
{    
    /// <summary>
    /// Clase de
    /// </summary>
    public class jQueryEffect
    {       
        string idControl;
        string idControlToTranfer;
        EffectType tipo;
        Effect efecto;
        SpeedEffect velocidad;
        int sizeToWidth;
        int sizeToHeight;
        int scaleTo;
        string callBackJavascriptFunction;
        bool autoExe;
        /// <summary>
        /// Clase efecto que genera el javascript
        /// </summary>
        public jQueryEffect()
        {
            IdControl = string.Empty;
            IdControlToTransfer = string.Empty;
            Effect = Effect.None;
            Speed = SpeedEffect.Normal;
            EffectType = EffectType.Effect;
            SizeToHeight = 60;
            SizeToWidth = 200;
            ScaleTo = 0;
            callBackJavascriptFunction = string.Empty;
            autoExe = false;
        }

        #region PROPIEDADES
        /// <summary>
        /// Ide del control sobre el que se quiere aplicar el efecto
        /// </summary>
        public string IdControl { get { return idControl; } set { idControl = value; } }
        /// <summary>
        /// Ide control que va a recibir el foco al realizarse el efecto Transfer.
        /// </summary>
        public string IdControlToTransfer { get { return idControlToTranfer; } set { idControlToTranfer = value; } }
        /// <summary>
        /// Cada efecto tiene 3 formas de ejecutarse: para mostrarse show, ocultarse hide o el que tenga asociado por defecto effect
        /// </summary>
        public EffectType EffectType { get { return tipo; } set { tipo = value; } }
        /// <summary>
        /// Efecto que se va a aplicar
        /// </summary>
        public Effect Effect { get { return efecto; } set { efecto = value; } }
        /// <summary>
        /// Velocidad de transición del efecto
        /// </summary>
        public SpeedEffect Speed { get { return velocidad; } set { velocidad = value; } }
        /// <summary>
        /// Solo se aplica al efecto size para agrandar o reducir el control
        /// </summary>
        public int SizeToWidth { get { return sizeToWidth; } set { sizeToWidth = value; } }
        /// <summary>
        /// Solo se aplica al efecto size para agrandar o reducir el control
        /// </summary>
        public int SizeToHeight { get { return sizeToHeight; } set { sizeToHeight = value; } }
        /// <summary>
        /// Solo se aplica al efecto scale para agrandar o reducir a un porcentaje del tamaño real del control
        /// </summary>
        public int ScaleTo { get { return scaleTo; } set { scaleTo = value; } }
        /// <summary>
        /// Función javascript a la que se quiere que se llame al terminar de ejecutarse el efecto.
        /// </summary>
        public string CallBackJavaScriptFunction { get { return callBackJavascriptFunction; } set { callBackJavascriptFunction = value; } }
        
        public bool AutoExecute { get { return autoExe; } set { autoExe = value; } }
        #endregion
        /// <summary>
        /// Nombre de la función javascript que lanza el efecto.
        /// </summary>
        public string JavaScriptFunction
        {
            get { return "runEffect" + IdControl; }
        }

        /// <summary>
        /// Crea la etiqueta HTML script con el codigo jquery necesario para generar el efecto
        /// </summary>
        /// <param name="ClientID">Identificador del control cliente al que se le aplicará el efecto</param>
        /// <param name="ClientIdToTransfer">Identificador del control del cliente al que se le pasará el foco. Solo disponible para el efecto Transfer</param>
        /// <param name="autoEjecutar">Ejecutar automaticamente el efecto</param>
        /// <returns></returns>
        public string ExecuteEffect(string ClientID, string ClientIdToTransfer)
        {            
            string script = "";
            
            script = "function " + JavaScriptFunction + "(){" +
                " var selectedEffect = '" + Effect.ToString().ToLower() + "';" +
                " var options = {};" +
                " if(selectedEffect == 'scale'){ options = {percent: " + ScaleTo.ToString() + "}; }" +
                " else if(selectedEffect == 'transfer'){ options = { to: '#" + ClientIdToTransfer + "', className: 'ui-effects-transfer' }; }" +
                " else if(selectedEffect == 'size'){ options = { to: {width: " + SizeToWidth.ToString() + ",height: " + SizeToHeight.ToString() + "} }; }" +
                " $('#" + ClientID + "')." + EffectType.ToString().ToLower() + "(selectedEffect,options,'" + Speed.ToString().ToLower() + "'" +
                (CallBackJavaScriptFunction != string.Empty ? ", " + CallBackJavaScriptFunction : "") + ");" +
                "}";
            if (AutoExecute)
                script += "$(document).ready(function () {" + JavaScriptFunction + "();});";                
            return script;            
        }

        /// <summary>
        /// Crea la etiqueta HTML script con el codigo jquery necesario para generar el efecto y lo ejecuta
        /// con el evento window.onload del cliente
        /// </summary>
        /// <param name="ClientID">Identificador del control cliente al que se le aplicará el efecto</param>
        /// <param name="ClientIdToTransfer">Identificador del control del cliente al que se le pasará el foco. Solo disponible para el efecto Transfer</param>        
        /// <returns></returns>
        public string ExecuteEffectsOnWindowLoad(string ClientID, string ClientIdToTransfer)
        {
            string script ="";            
            script = "function " + JavaScriptFunction + "(){" +
                " var selectedEffect = '" + Effect.ToString().ToLower() + "';" +
                " var options = {};" +
                " if(selectedEffect == 'scale'){ options = {percent: " + ScaleTo.ToString() + "}; }" +
                " else if(selectedEffect == 'transfer'){ options = { to: '#" + ClientIdToTransfer + "', className: 'ui-effects-transfer' }; }" +
                " else if(selectedEffect == 'size'){ options = { to: {width: " + SizeToWidth.ToString() + ",height: " + SizeToHeight.ToString() + "} }; }" +
                " $('#" + ClientID + "')." + EffectType.ToString().ToLower() + "(selectedEffect,options,'" + Speed.ToString().ToLower() + "'" +
                (CallBackJavaScriptFunction != string.Empty ? ", " + CallBackJavaScriptFunction : "") + ");" +
                "}" +
                "if(window.onload == null){window.onload=" + JavaScriptFunction + ";} else {window.onload+=" + JavaScriptFunction + ";}";
            return script;
        }
    }
}
